package com.github.cooingandwooing.task;

import cn.hutool.core.date.DateUtil;
import com.github.cooingandwooing.extend.DonothingDuplicationRemover;
import com.github.cooingandwooing.extend.HttpClientContextGet;
import com.github.cooingandwooing.extend.HttpClientDownloaderExtend;
import com.github.cooingandwooing.pipeline.HuayuPipeline;
import com.github.cooingandwooing.process.HuayuProcessor;
import com.github.cooingandwooing.utils.HuayuUrlBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.scheduler.QueueScheduler;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 〈华宇的案件信息获取类〉
 *
 * @author Administrator
 * @create 2022/5/9
 * @since 1.0.0
 */
@Component
public class HuayuTask {
    private HttpClientContextGet httpClientContextGet;
    private HuayuPipeline huayuPipeline;
    private HuayuProcessor huayuProcessor;

    @Autowired
    public HuayuTask(HttpClientContextGet httpClientContextGet, HuayuPipeline huayuPipeline, HuayuProcessor huayuProcessor) {
        this.httpClientContextGet = httpClientContextGet;
        this.huayuPipeline = huayuPipeline;
        this.huayuProcessor = huayuProcessor;
    }

    /**
     *  如果在多个函数上使用了@Scheduled，那么一定是一个执行完毕，才能排下一个。这往往不是我们想要的效果。此时需要在Scheduling配置类为schedule返回一个预定的线程池，如下：
     *  initialDelay当任务启动后, 等多久执行方法
     *  fixedDelay每隔多久执行方法
     *  获取首页信息
     */
    //@Scheduled(initialDelay = 1000, fixedDelay = 1000 * 1000, cron = "")
    @Deprecated
    public void doProcessHome() {
        // 华宇系统首页查询的 新收地址
        HttpClientContext httpClientContext = httpClientContextGet.HttpContextHuayu();
        if (httpClientContext != null) {
            Spider.create(this.huayuProcessor)
                    // 使用我们自己构建的下载器
                    .setDownloader(new HttpClientDownloaderExtend(httpClientContext))
                    // 其实 url 地址
                    .addUrl(HuayuUrlBuilder.buildUrlHome())
                    // 设置Secheduler 内存队列中
                    .setScheduler(new QueueScheduler()
                            // 设置HashSetDuplicateRemover（也可以用 Bloom去重 30w 条数据）
                            // .setDuplicateRemover(new BloomFilterDuplicateRemover(10000000))) //参数设置需要对多少条数据去重
                    )
                    // 线程数
                    .thread(1)
                    // 设置自定义的Pipeline储存数据, 不写这个
                    .addPipeline(this.huayuPipeline)
                    .run();
        }
    }


    /**
     * 新收案件
     */
    //@Scheduled(initialDelay = 1000, fixedDelay = 1000 * 1000, cron = "")
    public void doProcessListPageNewCases() {
        // 华宇系统首页查询的 新收地址
        HttpClientContext httpClientContext = httpClientContextGet.HttpContextHuayu();
        if (httpClientContext != null) {
            Spider.create(this.huayuProcessor)
                    // 使用我们自己构建的下载器
                    .setDownloader(new HttpClientDownloaderExtend(httpClientContext))
                    // 其实 url 地址
                    .addUrl(HuayuUrlBuilder.buildUrlListNewCases())
                    // 设置Secheduler 内存队列中
                    .setScheduler(new QueueScheduler()
                            // 设置HashSetDuplicateRemover（也可以用 Bloom去重 30w 条数据）
                            // .setDuplicateRemover(new BloomFilterDuplicateRemover(10000000))) //参数设置需要对多少条数据去重
                    )
                    // 线程数
                    .thread(15)
                    // 设置自定义的Pipeline储存数据, 不写这个
                    .addPipeline(this.huayuPipeline)
                    .run();
        }
    }

    /**
     * 总计列表获取
     */
    public void doProcessListPageTotalCases() {
        // 华宇系统首页查询的 新收地址
        HttpClientContext httpClientContext = httpClientContextGet.HttpContextHuayu();
        if (httpClientContext != null) {
            Spider.create(this.huayuProcessor)
                    // 使用我们自己构建的下载器
                    .setDownloader(new HttpClientDownloaderExtend(httpClientContext))
                    // 其实 url 地址
                    .addUrl(HuayuUrlBuilder.getFirstPageUrlByColumNum(DateUtil.parse("2021-01-01", "yyyy-MM-dd"),
                            DateUtil.parse("2021-12-31", "yyyy-MM-dd"), "5"))
                    // 设置Secheduler 内存队列中
                    .setScheduler(new QueueScheduler().setDuplicateRemover(new DonothingDuplicationRemover())
                            // 设置HashSetDuplicateRemover（也可以用 Bloom去重 30w 条数据）
                            // .setDuplicateRemover(new BloomFilterDuplicateRemover(10000000))) //参数设置需要对多少条数据去重
                    )
                    // 线程数
                    .thread(15)
                    // 设置自定义的Pipeline储存数据, 不写这个
                    .addPipeline(this.huayuPipeline)
                    .run();
        }
    }
}
